﻿USE [GestionePolveri]
GO
/****** Object:  StoredProcedure [GP].[ReportDirezionale2]    Script Date: 12/02/2012 21:09:54 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:		Giuseppe Dattilo
-- Create date: 21/08/2012
-- Description:	Carica i dati per il report direzionale ordinati per 'Famiglia', 'ColoriAbbinati'...
-- =============================================
ALTER PROCEDURE [GP].[ReportDirezionale2] 
	@DatamovimentoFrom          DateTime     = NULL,
	@DatamovimentoTo            DateTime     = NULL,
	@CodicePolvere              Varchar(100) = NULL,
	@Famiglia                   Varchar(100) = NULL,
	@Impianto                   Varchar(100) = NULL,
	@Applicazione               Char(1)      = NULL,
	@ColoriAbbinati             Varchar(200) = NULL,
	@SortOrder                  tinyint = NULL,
	@Tipo                       tinyint = NULL
AS
BEGIN
	-- SET NOCOUNT ON added to prevent extra result sets from
	-- interfering with SELECT statements.
	SET NOCOUNT ON;

	WITH cteColoriAbbinati(CodicePolvere, CodiceColore) AS 
	(
		SELECT DISTINCT A.CodicePolvere, C.CodiceColore
		FROM GP.AnagPolveri as A
		INNER JOIN GP.ComposizioneColori as CC ON A.IDPolvere = CC.IDPolvere 
		INNER JOIN GP.AnagColori AS C ON CC.IDColore = C.IDColore
		INNER JOIN GP.AnagFamiglie AS F ON C.IDFamiglia = F.IDFamiglia
	),
	cteFamiglia(CodicePolvere, descrizione, IDFamiglia) AS 
	(
		SELECT DISTINCT A.CodicePolvere, F.descrizione, F.IDFamiglia
		FROM GP.AnagPolveri as A
		INNER JOIN GP.ComposizioneColori as CC ON A.IDPolvere = CC.IDPolvere 
		INNER JOIN GP.AnagColori AS C ON CC.IDColore = C.IDColore
		INNER JOIN GP.AnagFamiglie AS F ON C.IDFamiglia = F.IDFamiglia
	),
	cteApplicazioni(CodicePolvere, Applicazione) AS 
	(
		SELECT DISTINCT A.CodicePolvere, CC.Applicazione
		FROM GP.AnagPolveri as A
		INNER JOIN GP.ComposizioneColori as CC ON A.IDPolvere = CC.IDPolvere 
	)
	SELECT
	Stuff(( select ',' + Sub.Applicazione AS [text()] from cteApplicazioni as Sub where Sub.CodicePolvere = cteApplicazioni.CodicePolvere for xml path('')), 1, 1, '') as 'Applicazione'
	,P1.CodicePolvere
	,Stuff(( select ',' + Sub.Descrizione AS [text()] from cteFamiglia as Sub where Sub.CodicePolvere = cteFamiglia.CodicePolvere for xml path('')), 1, 1, '') as 'Famiglia'
	,P1.IDPolvere, P1.Descrizione, P1.Note
	,GP.AnagFornitori.Descrizione AS Fornitore
	,Stuff(( select ',' + Sub.CodiceColore AS [text()] from cteColoriAbbinati as Sub where Sub.CodicePolvere = cteColoriAbbinati.CodicePolvere order by Sub.CodiceColore for xml path('')), 1, 1, '') as 'ColoriAbbinati'
	--,sum(gp.lotti.giacenza) as Giacenza, sum(gp.lotti.valore) as Valore
	,(isnull(CaricoJ, 0.00) - isnull(ScaricoJ, 0.00)) as 'Giacenza', sum(gp.lotti.valore) as Valore
    ,isnull(CaricoJ, 0.00) as Carico, isnull(ScaricoJ, 0.00) as Scarico


	,TPU.PrezzoUnitario
	,P1.ScortaMinima
	,isnull(SC.[RAL1], 0.00) as Cons_RAL1
	,isnull(SC.[RAL2], 0.00) as Cons_RAL2
	,isnull(SC.[Verticale], 0.00) as Cons_Verticale
	,isnull(SC.[Sublimato], 0.00) as Cons_Sublimato
	,isnull(SC.[Colorwood Grande], 0.00) as Cons_ColorwoodGrande
	,isnull(SC.[Ferro], 0.00) as Cons_Ferro
	,isnull(SC.[Allineamento inventario], 0.00) as Cons_AllineamentoInventario
	,isnull(SC.[Reso], 0.00) as Cons_Reso
	,isnull(SC.[Venduto], 0.00) as Cons_Venduto
	,isnull(SC.[Smaltito], 0.00) as Cons_Smaltito
	,isnull(SC.[Colorwood Piccolo], 0.00) as Cons_ColorwoodPiccolo
	,isnull(SC.[Inventario], 0.00) as Cons_Correzione
	,isnull(ST.[RAL1], 0.00) as NP_RAL1
	,isnull(ST.[RAL2], 0.00) as NP_RAL2
	,isnull(ST.[Verticale], 0.00) as NP_Verticale
	,isnull(ST.[Sublimato], 0.00) as NP_Sublimato
	,isnull(ST.[Colorwood Grande], 0.00) as NP_ColorwoodGrande
	,isnull(ST.[Ferro], 0.00) as NP_Ferro
	,isnull(ST.[Allineamento inventario], 0.00) as NP_AllineamentoInventatio
	,isnull(ST.[Reso], 0.00) as NP_Reso
	,isnull(ST.[Venduto], 0.00) as NP_Venduto
	,isnull(ST.[Smaltito], 0.00) as NP_Smaltito
	,isnull(ST.[Colorwood Piccolo], 0.00) as NP_ColorwoodPiccolo
	,isnull(ST.[Inventario], 0.00) as NP_Correzione
	FROM GP.AnagPolveri as P1 with (nolock)
	INNER JOIN GP.AnagFornitori ON P1.IDFornitore = GP.AnagFornitori.IDFornitore
	left outer join cteFamiglia on cteFamiglia.codicepolvere = p1.codicepolvere
	left outer join cteColoriabbinati on cteColoriAbbinati.codicepolvere = p1.codicepolvere
	left outer join cteApplicazioni on cteApplicazioni.codicepolvere = p1.codicepolvere
	left outer join GP.Lotti On gp.lotti.idpolvere = P1.idpolvere
	left outer join (
		select gp.movimenti.idpolvere, sum(Quantita) as CaricoJ 
		from gp.movimenti
		inner join gp.causalimagazzino on gp.movimenti.idcausale = gp.causalimagazzino.idcausale 
		where gp.causalimagazzino.codcausale = 'C' 
		and (((@DatamovimentoFrom is null) and (@DatamovimentoTo is null)) OR (GP.Movimenti.DataMovimento between @DatamovimentoFrom and @DatamovimentoTo))
		group by gp.movimenti.idpolvere
	) as TC on P1.idpolvere = TC.idpolvere
	left outer join (
		select gp.movimenti.idpolvere, sum(Quantita) as ScaricoJ 
		from gp.movimenti
		inner join gp.causalimagazzino on gp.movimenti.idcausale = gp.causalimagazzino.idcausale
		INNER JOIN GP.causalimagazzino ON GP.Movimenti.IDcausale = GP.causalimagazzino.IDcausale 
		where gp.causalimagazzino.codcausale = 'S' 
		and (((@DatamovimentoFrom is null) and (@DatamovimentoTo is null)) OR (GP.Movimenti.DataMovimento between @DatamovimentoFrom and @DatamovimentoTo))
		and ((@Impianto is null) OR (GP.Impianti.IDImpianto IN (select param from GP.fn_Parametri(@Impianto, ','))))
		group by gp.movimenti.idpolvere
	) as TS on P1.idpolvere = TS.idpolvere
	outer apply (
		select top 1 GPLT.idpolvere, GPLT.prezzounitario 
		from gp.lotti as GPLT
		where gplt.idpolvere = p1.idpolvere
		order by GPLT.dataddt desc
	) as TPU -- on TPU.idpolvere = P1.idpolvere
	left outer join (
		select * from 
		(
			SELECT
			GP.Movimenti.idpolvere, GP.Movimenti.Quantita, GP.Impianti.Impianto
			FROM GP.Movimenti 
			INNER JOIN GP.Impianti ON GP.Movimenti.IDImpianto = GP.Impianti.IDImpianto 
			INNER JOIN GP.causalimagazzino ON GP.Movimenti.IDcausale = GP.causalimagazzino.IDcausale 
			where GP.causalimagazzino.codcausale = 'S' 
		          and (((@DatamovimentoFrom is null) and (@DatamovimentoTo is null)) OR (GP.Movimenti.DataMovimento between @DatamovimentoFrom and @DatamovimentoTo))
		          and ((@Impianto is null) OR (GP.Impianti.IDImpianto IN (select param from GP.fn_Parametri(@Impianto, ','))))
		) DataTable
		PIVOT
		(
		   sum(quantita)
		   FOR impianto IN ([RAL1],[RAL2],[Verticale],[Sublimato],[Colorwood Grande],
									[Ferro],[Allineamento inventario],[Reso],[Venduto],[Smaltito],[Colorwood Piccolo], [Inventario])
		) PivotTable
	) as SC on P1.idpolvere = SC.idpolvere
	left outer join (
		select * from 
		(
			SELECT
			GP.Movimenti.idpolvere, GP.Movimenti.Quantita, GP.Impianti.Impianto
			FROM GP.Movimenti 
			INNER JOIN GP.Impianti ON GP.Movimenti.IDImpianto = GP.Impianti.IDImpianto 
			INNER JOIN GP.causalimagazzino ON GP.Movimenti.IDcausale = GP.causalimagazzino.IDcausale 
			where GP.causalimagazzino.codcausale = 'S' 
			      and (((@DatamovimentoFrom is null) and (@DatamovimentoTo is null)) OR (GP.Movimenti.DataMovimento between @DatamovimentoFrom and @DatamovimentoTo))
			      and ((@Impianto is null) OR (GP.Impianti.IDImpianto IN (select param from GP.fn_Parametri(@Impianto, ','))))
		) DataTable
		PIVOT
		(
		   count(quantita)
		   FOR impianto IN ([RAL1],
		                    [RAL2],
		                    [Verticale],
		                    [Sublimato],
		                    [Colorwood Grande],
							[Ferro],
							[Allineamento inventario],
							[Reso],
							[Venduto],
							[Smaltito],
							[Colorwood Piccolo],
							[Inventario])
		) PivotTable
	) as ST on P1.idpolvere = ST.idpolvere
	where 
	  ((@CodicePolvere is null) OR (P1.CodicePolvere Like @CodicePolvere))
	  and ((@Famiglia is null) OR (cteFamiglia.IDFamiglia IN (select param from GP.fn_Parametri(@Famiglia, ','))))
	  and ((@Applicazione is null) OR (cteApplicazioni.Applicazione Like @Applicazione))
	  and ((@ColoriAbbinati is null) OR (cteColoriAbbinati.CodiceColore Like @ColoriAbbinati))
	  and ((@Tipo is null) OR (P1.IsCodiceCustom Like @Tipo))
	group by
	P1.CodicePolvere, P1.IDPolvere, P1.Descrizione, P1.ScortaMinima, P1.Note
	,GP.AnagFornitori.Descrizione
	,TC.CaricoJ, TS.ScaricoJ,TPU.PrezzoUnitario
	,SC.[RAL1],SC.[RAL2],SC.[Verticale],SC.[Sublimato],SC.[Colorwood Grande],SC.[Ferro],SC.[Allineamento inventario],SC.[Reso],SC.[Venduto],SC.[Smaltito],SC.[Colorwood Piccolo], SC.[Inventario]
    ,ST.[RAL1],ST.[RAL2],ST.[Verticale],ST.[Sublimato],ST.[Colorwood Grande],ST.[Ferro],ST.[Allineamento inventario],ST.[Reso],ST.[Venduto],ST.[Smaltito],ST.[Colorwood Piccolo], ST.[Inventario]
	,cteFamiglia.codicepolvere
	,cteColoriAbbinati.codicepolvere
	,cteApplicazioni.CodicePolvere
	order by 'Famiglia', 'ColoriAbbinati'
	--ORDER BY
	--     CASE WHEN @SortOrder = 1 THEN CONVERT(char(200), 'Famiglia') + CONVERT(char(200), P1.codicepolvere)
 --             WHEN @SortOrder = 2 THEN CONVERT(char(200), 'Famiglia') + CONVERT(char(200), 'ColoriAbbinati')
 --        END
END
